package br.ufal.questione.dao.hibernate;

import java.util.List;

import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import br.ufal.questione.dao.DaoException;
import br.ufal.questione.dao.PerguntaDao;
import br.ufal.questione.domain.Pergunta;
import br.ufal.questione.domain.Questionario;

@Repository
public class HibernatePerguntaDao extends HibernateGenericDao<Pergunta, Long> implements PerguntaDao {

	@Override
	public Integer getUltimaOrdemPergunta(Questionario questionario) {
		try {
			Integer ordem = (Integer) super.getSession().createCriteria(super.getClassEntidade())
				.setProjection(Projections.max("ordem"))
				.add(Restrictions.eq("questionario", questionario))
				.uniqueResult();
			
			if (ordem == null) {
				return 1;
			}
			
			return ordem + 1;
		} catch (Exception e) {
			throw new DaoException(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public void reorganizarPerguntas(Questionario questionario) {
		try {
			List<Pergunta> perguntas = super.getSession().createCriteria(super.getClassEntidade())
				.add(Restrictions.eq("questionario", questionario))
				.addOrder(Order.asc("ordem"))
				.list();
			
			Integer ordem = 1;
			for (Pergunta pergunta : perguntas) {
				pergunta.setOrdem(ordem++);
			}
		} catch (Exception e) {
			throw new DaoException(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public void subirOrdem(Pergunta pergunta) {
		try {
			pergunta = super.consultar(pergunta.getId());
			
			List<Pergunta> perguntas = super.getSession().createCriteria(super.getClassEntidade())
				.add(Restrictions.eq("questionario", pergunta.getQuestionario()))
				.addOrder(Order.desc("ordem"))
				.list();
			
			for (Pergunta perg : perguntas) {				
				if (perg.getOrdem() < pergunta.getOrdem()) {
					Integer ordem = pergunta.getOrdem();
					pergunta.setOrdem(perg.getOrdem());
					perg.setOrdem(ordem);
					break;
				}
			}
		} catch (Exception e) {
			throw new DaoException(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public void descerOrdem(Pergunta pergunta) {
		try {
			pergunta = super.consultar(pergunta.getId());
			
			List<Pergunta> perguntas = super.getSession().createCriteria(super.getClassEntidade())
				.add(Restrictions.eq("questionario", pergunta.getQuestionario()))
				.addOrder(Order.asc("ordem"))
				.list();
			
			for (Pergunta perg : perguntas) {				
				if (perg.getOrdem() > pergunta.getOrdem()) {
					Integer ordem = pergunta.getOrdem();
					pergunta.setOrdem(perg.getOrdem());
					perg.setOrdem(ordem);
					break;
				}
			}
		} catch (Exception e) {
			throw new DaoException(e);
		}
	}
	
}
